import matplotlib.pyplot as plt
import numpy as np

# 设置中文字体支持
plt.rcParams['font.sans-serif'] = ['Arial Unicode MS', 'SimHei', 'DejaVu Sans']
plt.rcParams['axes.unicode_minus'] = False

# 数据：不同方法在不同服务上的准确率（百分比）
services = ['checkout 服务', 'frontend 服务', 'cart 服务', 'shipping 服务', 'kafka 消息队列', 'envoy 网关',
            'otel-demo 平均']
methods = ['Seeflow', 'TraceWeaver', 'WAP5', 'FCFS']

accuracy_data = {
    'Seeflow': [100, 95, 100, 100, 100, 100],
    'TraceWeaver': [88, 80, 0, 100, 0, 100],  # 0 代表 'NaN'
    'WAP5': [58, 28, 75, 49, 0, 98],
    'FCFS': [2, 92, 100, 100, 0, 96]
}

# 计算各方法的均值
for method, acc in accuracy_data.items():
    accuracy_data[method].append(int(np.mean(acc)))

# 设置柱状图参数
x = np.arange(len(services))
width = 0.2
colors = ['#2E86AB', '#A23B72', '#F18F01', '#C73E1D']

# 创建图形
fig, ax = plt.subplots(figsize=(12, 7))

# 绘制柱状图
for i, method in enumerate(methods):
    offset = width * (i - 1.5)
    bars = ax.bar(x + offset, accuracy_data[method], width,
                  label=method, color=colors[i], alpha=0.8)

    # 在柱子上添加数值标签
    for bar in bars:
        height = bar.get_height()
        ax.text(bar.get_x() + bar.get_width() / 2., height,
                f'{height if height else "N/A"}',
                ha='center', va='bottom', fontsize=9)

# 设置图表属性
ax.set_xlabel('服务', fontsize=12, fontweight='bold')
ax.set_ylabel('准确率 (%)', fontsize=12, fontweight='bold')
ax.set_title('不同方法在 otel-demo 不同服务上的链路准确率对比', fontsize=14, fontweight='bold', pad=20)
ax.set_xticks(x)
ax.set_xticklabels(services)
ax.legend(loc='upper right', fontsize=10)
ax.set_ylim(0, 100)
ax.grid(axis='y', alpha=0.3, linestyle='--')

# 调整布局
plt.tight_layout()

# 保存图片
plt.savefig('./data/accuracy_comparison.png', dpi=300, bbox_inches='tight')
